<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>创建对象的方式</title>
</head>
<body>
    <script>
    /* 
        创建对象的方式

        1.字面量方式创建对象
          + var obj = {...}
          + 可以用后期动态添加
        2.内置构造函数创建对象
          + var obj = new object()
          +  + 可以用后期动态添加
        3.工厂函数创建对象
          3-1.制造一个工厂函数
          3-2.使用工厂函数去创建对象
        4.自定义构造函数创建对象
          4-1.制造一个自定义构造函数
          4-2.使用自定义构造函数去创建对象

        前两种不善于批量生产
        后两种可以批量生产：第三种相比第四种需要多做两个步骤，第四种更方便
     */

     //1.字面量方式创建对象
    //  var obj={
    //      name:'Jack',
    //      age:18,
    //      sayHi:function(){console.log('hello world')}
    //  }

     //如果我想创建第二个对象
    //  var obj1={
    //      name:'Rose',
    //      age:20,
    //      sayHi:function(){console.log('hello world')}
    //  }


    //2.内置构造函数创建对象
    // var obj =new Object()
    // obj.name='Jack'
    // obj.age=18
    // obj.sayHi=function(){
    //     console.log('hello world')
    // }


    //3.工厂函数创建对象
    //3-1.创建工厂函数
    // function createObj(name,age){
    //     //手动创建一个对象
    //     var obj={}

    //     //手动在里面添加属性
    //     obj.name=name
    //     obj.age=age
    //     obj.sayHi=function(){
    //      console.log('hello world')
    //  }
    //  //手动返回这个对象
    //  return obj
    // }

    //3-2.使用工厂函数去创建对象
    // var obj1=createObj('Jack',18)
    // var obj2=createObj('Rose',20)
    // console.log(obj1,obj2)

    
    //4.自定义构造函数创建对象
    //4-1. 制造一个自定义构造函数
    //构造函数会自动创建对象，自动返回这个对象
    //我们只需要手动里面添加内容就可以了
    function createObj(name,age){
        //自动创建对象

        //手动向对象里面添加成员
        //这里的this指向当前实例(new 前面的变量)
        this.name=name
        this.age=age
        this.sayHi=function(){
         console.log('hello world')}

        //自动返回对象
    }
    //4-2. 使用自定义构造函数去创建对象
    //构造函数在使用的时候，需要和new关键字连用
    //如果不连用，那么没有意义

    //第一次调用createObj的时候，和new关键字连用了
    //我们createObj里面的this指向了obj1
    //函数内部的代码在执行的时候，就是在向obj1添加了name age 和sayHi三个成员
    var obj1=new createObj('Jack',18)

    //第二次调用createObj的时候，和new关键字连用了
    //我们createObj里面的this指向了obj2
    //函数内部的代码在执行的时候，就是在向obj2添加了name age 和sayHi三个成员
    var obj2=new createObj('Rose',20)

    console.log(obj1,obj2)
    </script>
</body>
</html>